package cn.iocoder.yudao.module.system.service.messageType;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.system.controller.admin.messageType.vo.MessageTypeCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.messageType.vo.MessageTypeExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.messageType.vo.MessageTypePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.messageType.vo.MessageTypeUpdateReqVO;
import cn.iocoder.yudao.module.system.convert.messageType.MessageTypeConvert;
import cn.iocoder.yudao.module.system.dal.dataobject.message.MessageCountDo;
import cn.iocoder.yudao.module.system.dal.dataobject.messageType.MessageTypeDO;
import cn.iocoder.yudao.module.system.dal.mysql.messageType.MessageTypeMapper;
import cn.iocoder.yudao.module.system.service.message.MessageService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.*;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MESSAGE_TYPE_NOT_EXISTS;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MESSAGE_TYPE_SYSTEM;

/**
 * 站内信类型 Service 实现类
 *
 * @author 管理员
 */
@Service
@Validated
public class MessageTypeServiceImpl implements MessageTypeService {

    @Resource
    private MessageTypeMapper messageTypeMapper;
    @Resource
    private MessageService messageService;
    @Override
    @TenantIgnore
    public Long createMessageType(MessageTypeCreateReqVO createReqVO) {
        // 插入
        MessageTypeDO messageType = MessageTypeConvert.INSTANCE.convert(createReqVO);
        messageType.setCreator(SecurityFrameworkUtils.getLoginUser().getUsername());
        messageType.setCreateTime(new Date());
        messageTypeMapper.insert(messageType);
        // 返回
        return messageType.getId();
    }

    @Override
    @TenantIgnore
    public void updateMessageType(MessageTypeUpdateReqVO updateReqVO) {
        // 校验存在
        this.validateMessageTypeExists(updateReqVO.getId());
        if(updateReqVO.getId().equals(1)||updateReqVO.getId().equals(2)||updateReqVO.getId().equals(3)){
            throw exception(MESSAGE_TYPE_SYSTEM);
        }
        // 更新
        MessageTypeDO updateObj = MessageTypeConvert.INSTANCE.convert(updateReqVO);
        updateObj.setUpdater(SecurityFrameworkUtils.getLoginUser().getUsername());
        updateObj.setUpdateTime(new Date());
        messageTypeMapper.updateById(updateObj);
    }

    @Override
    @TenantIgnore
    public void deleteMessageType(Long id) {
        // 校验存在
        this.validateMessageTypeExists(id);
        if(id.equals(1)||id.equals(2)||id.equals(3)){
            throw exception(MESSAGE_TYPE_SYSTEM);
        }
        // 删除
        messageTypeMapper.deleteById(id);
    }

    private void validateMessageTypeExists(Long id) {
        if (messageTypeMapper.selectById(id) == null) {
            throw exception(MESSAGE_TYPE_NOT_EXISTS);
        }
    }

    @Override
    @TenantIgnore
    public MessageTypeDO getMessageType(Long id) {
        return messageTypeMapper.selectById(id);
    }

    @Override
    @TenantIgnore
    public List<MessageTypeDO> getMessageTypeList(Collection<Long> ids) {
        return messageTypeMapper.selectBatchIds(ids);
    }

    @Override
    @TenantIgnore
    public List<MessageTypeDO> getMessageTypeList() {
        return messageTypeMapper.selectList();
    }

    @Override
    @TenantIgnore
    public PageResult<MessageTypeDO> getMessageTypePage(MessageTypePageReqVO pageReqVO) {
        PageResult<MessageTypeDO> messageTypeDOPageResult=messageTypeMapper.selectPage(pageReqVO);
        List<MessageTypeDO> messageTypeDOList=messageTypeDOPageResult.getList();
        List<MessageCountDo> nummapList=messageService.getAllMessageCount();
        Map<Long, Integer> nummap=new HashMap<>();
        for (MessageCountDo messageCountDo:nummapList) {
            nummap.put(messageCountDo.getType(),messageCountDo.getNumber());
        }
        for (MessageTypeDO messageTypeDO:messageTypeDOList) {
            messageTypeDO.setNum(nummap.get(messageTypeDO.getId()));
        }
        messageTypeDOPageResult.setList(messageTypeDOList);
        return messageTypeDOPageResult;
    }

    @Override
    @TenantIgnore
    public List<MessageTypeDO> getMessageTypeList(MessageTypeExportReqVO exportReqVO) {
        return messageTypeMapper.selectList(exportReqVO);
    }

    @Override
    public PageResult<MessageTypeDO> getMessageTypeRecoveryPage(MessageTypePageReqVO pageReqVO) {
        // MyBatis Plus 查询
        IPage<MessageTypeDO> mpPage = MyBatisUtils.buildPage(pageReqVO);
        // 转换返回
        Map<String, Object> params = new HashMap<>();
        if(StringUtils.isNotBlank(pageReqVO.getStatus())){
            params.put("status",pageReqVO.getStatus());
        }
        if(StringUtils.isNotBlank(pageReqVO.getName())){
            params.put("name",pageReqVO.getName());
        }

        mpPage.setRecords(messageTypeMapper.recoveryMessageTypePage(mpPage, params));
        List<MessageTypeDO> messageTypeDOList=mpPage.getRecords();
        List<MessageCountDo> nummapList=messageService.getAllMessageCount();
        Map<Long, Integer> nummap=new HashMap<>();
        for (MessageCountDo messageCountDo:nummapList) {
            nummap.put(messageCountDo.getType(),messageCountDo.getNumber());
        }
        for (MessageTypeDO messageTypeDO:messageTypeDOList) {
            messageTypeDO.setNum(nummap.get(messageTypeDO.getId()));
        }
        return new PageResult<>(messageTypeDOList, mpPage.getTotal());
    }

    @Override
    public void updateMessageTypeSort(List<Long> ids) {
        List<MessageTypeDO> list=new ArrayList<>();
        int size = ids.size();
        for (int i = 0; i <size ; i++) {
            MessageTypeDO r=new MessageTypeDO();
            r.setId(ids.get(i));
            r.setTop(new Long(size-i));
            list.add(r);
        }
        messageTypeMapper.updateMessageTypeSort(list);
    }

    @Override
    public void updateBatchRecoveryMessageType(List<Long> ids) {
        messageTypeMapper.updateBatchRecoveryMessageType(ids);
    }

}
